package com.todod.base.module.infra.service.basegenerateno;

import com.todod.base.module.infra.framework.redis.CacheService;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.*;
import com.todod.base.module.infra.dal.dataobject.basegenerateno.BaseGenerateNoDO;
import com.todod.base.framework.common.pojo.PageResult;
import com.todod.base.framework.common.pojo.PageParam;
import com.todod.base.framework.common.util.object.BeanUtils;

import com.todod.base.module.infra.dal.mysql.basegenerateno.BaseGenerateNoMapper;

import static com.todod.base.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.todod.base.module.infra.enums.ErrorCodeConstants.*;

/**
 * 系统生成编号 Service 实现类
 *
 * @author 平台管理员
 */
@Service
@Validated
public class BaseGenerateNoServiceImpl implements BaseGenerateNoService {
    @Resource
    private CacheService redisService;

    @Resource
    private BaseGenerateNoMapper baseGenerateNoMapper;

    @Override
    public void updateBaseGenerateNo(BaseGenerateNoDO updateObj) {
        // 更新
//        BaseGenerateNoDO updateObj = BeanUtils.toBean(updateReqVO, BaseGenerateNoDO.class);
        baseGenerateNoMapper.updateById(updateObj);
    }

    @Override
    public BaseGenerateNoDO getBaseGenerateNo(Short id) {
        return baseGenerateNoMapper.selectById(id);
    }

    /**
     * 从流水号表中取当前某个单据的流水号数值
     *
     * @author todod
     *
     * @param tableName
     * @param num
     * @return
     */
    @Override
    public synchronized String getSeqByTableAndNum(String seqName, int num) {
        String seqNum = "";
        // 查询流水号表
//        BaseGenerateNoDO generaNo = baseGenerateNoMapper.getGeneraNoBySeqName(seqName);
//        if (generaNo != null) {
//            if (generaNo.getStartval().toString().length() > num) {
//                // 当seq里的值超过最大值后，则初始化成num长度的最小值
//                generaNo.setStartval(1L);
//                baseGenerateNoMapper.updateById(generaNo);
//                seqNum = getSeqNum(new BigDecimal(1), num);
//            } else {
//                seqNum = getSeqNum(new BigDecimal(generaNo.getStartval()), num);
//
//            }
//            // 更新seq表的数据
//            generaNo.setStartval((new BigDecimal(generaNo.getStartval()).add(new BigDecimal(generaNo.getStep()))).longValue());
//
//            baseGenerateNoMapper.updateById(generaNo);
//
//        } else {
//            seqNum = getSeqNum(new BigDecimal(1), num);
//        }
        Long incrementNum = redisService.getIncrementNum(seqName);
        seqNum = getSeqNum(new BigDecimal(incrementNum), num);
        return seqNum;
    }

    /**
     * 根据当前顺序号及单据号要求位数，对顺序号进行格式化
     *
     * @author todod
     *
     * @param startVal
     * @param num
     * @return
     */
    public String getSeqNum(BigDecimal startVal, int num) {
        String zeroStr = "0000000000";
        String seqNum = zeroStr
                .substring(0, num - startVal.toString().length())
                + startVal.toString();

        return seqNum;
    }


    public static void main(String[] args) {
        System.out.println(new BaseGenerateNoServiceImpl().getSeqNum(new BigDecimal(1), 10));
        System.out.println(new BaseGenerateNoServiceImpl().getSeqNum(new BigDecimal(1), 9));
        System.out.println(new BaseGenerateNoServiceImpl().getSeqNum(new BigDecimal(1), 8)); // saveSeqByTableAndNum
//        System.out.println(new BaseGenerateNoServiceImpl().saveSeqByTableAndNum("HX", 8));
//        String orderNum = "XH" + tododDate.getYmd() + seqManager.saveSeqByTableAndNum("purchase_sales", 4);
        // H20240809000000001
    }

}